In this Rmarkdown document we are going to load the MAGIC-denoised data to better visualize genes and ease with the annotation when using specific marker genes. MAGIC was developed by Smita Krishnaswamy’s lab to try to fill in the drop out reads in the spots. MAGIC is a Markov Affinity-based Graph Imputation of Cells used for denoising high-dimensional data most commonly applied to single-cell RNA sequencing data. MAGIC learns the manifold data, using the resultant graph to smooth the features and restore the structure of the data based on their k-nearest neighbors.
library(Seurat)
library(dplyr)
library(ggplot2)
library(SPATA2)
set.seed(123)
source(here::here("misc/paths.R"))
source(here::here("utils/bin.R"))
"{cd4}/{plt_dir}" %>%
glue::glue() %>%
here::here() %>%
dir.create(path = .,
showWarnings = FALSE,
recursive = TRUE)
"{cd4}/{robj_dir}" %>%
glue::glue() %>%
here::here() %>%
dir.create(path = .,
showWarnings = FALSE,
recursive = TRUE)
scatterplot <- function(x, y, color) {
df <- data.frame(
feat1 = se_sub@assays$MAGIC_Spatial@data[x, ],
feat2 = se_sub@assays$MAGIC_Spatial@data[y, ],
color = se_sub@meta.data[, color]
)
ggplot2::ggplot(df,
ggplot2::aes(x = feat1,
y = feat2,
color = color)) +
ggplot2::geom_point() +
ggplot2::theme_classic() +
ggplot2::labs(
x = x,
y = y,
color = color)
}
The data used in this Rmarkdown document comes from 03-clustering_integration.Rmd where the data was integrated.
merged_se <- "{clust}/{robj_dir}/integrated_spatial.rds" %>%
glue::glue() %>%
here::here() %>%
readRDS(file = .)
Load MAGIC data from the script MAGIC_denoising.Rmd
magic_df <- "{cd4}/{robj_dir}/MAGIC-mtrx.rds" %>%
glue::glue() %>%
here::here() %>%
readRDS(file = .)
# create a new assay to store ADT information
magic_assay <- CreateAssayObject(counts = as.matrix(magic_df))
# add this assay to the previously created Seurat object
merged_se[["MAGIC_Spatial"]] <- magic_assay
The markers denoised and used here come from 2 papers published on Tfh differentiation
- T Follicular Helper Cell Biology: A Decade of Discovery and Diseases
- Bcl6-Mediated Transcriptional Regulation of Follicular Helper T cells (Tfh)
A Spatially Resolved Dark- versus Light-Zone Microenvironment Signature Subdivides Germinal Center-Related Aggressive B Cell Lymphomas - Dark Zone: OAZ1, AICDA, H3, MKI67, POLH - Light Zone: LAG3, ITGB8, PDCD1, TIGIT, BCL2, PECAM1, LY6E, B7-H3 (CD276), HLA-DRB1, PSMB10, TNF, ARG1, HLA-E, STAT1
"{cd4}/gene_dict.R" %>%
glue::glue() %>%
here::here() %>%
source(file = .)
gene_vec <- gene_vec[gene_vec %in% rownames(merged_se)]
Add gene signatures for LZ and DZ, these signatures are calculated with the lognorm expression.
merged_se <- Seurat::AddModuleScore(
object = merged_se,
features = list(gene_dict[["LZ"]]),
name = "LZ_signature")
merged_se <- Seurat::AddModuleScore(
object = merged_se,
features = list(gene_dict[["DZ"]]),
name = "DZ_signature")
Look at signatures
Seurat::SpatialPlot(
object = merged_se,
features = c("LZ_signature1", "DZ_signature1"),
alpha = c(0, 1),
images = "esvq52_nluss5",
ncol = 2)
Add annotation to the slides
merged_se[["annotation"]] <- dplyr::case_when(
merged_se@meta.data$Spatial_snn_res.0.3 == 0 ~ "Inter-follicular zone 1",
merged_se@meta.data$Spatial_snn_res.0.3 == 1 ~ "T cell zone",
merged_se@meta.data$Spatial_snn_res.0.3 == 2 ~ "Follicle",
merged_se@meta.data$Spatial_snn_res.0.3 == 3 ~ "Epithelial 1",
merged_se@meta.data$Spatial_snn_res.0.3 == 4 ~ "Follicle Proliferating",
merged_se@meta.data$Spatial_snn_res.0.3 == 5 ~ "Epithelial 2",
merged_se@meta.data$Spatial_snn_res.0.3 == 6 ~ "Inter-follicular zone 2",
merged_se@meta.data$Spatial_snn_res.0.3 == 7 ~ "Muscle",
)
Look at the location where the marker genes are expressed along with the cell types
Seurat::DefaultAssay(merged_se) <- "MAGIC_Spatial"
gene_plt <- Seurat::SpatialFeaturePlot(object = merged_se,
features = gene_vec,
alpha = c(0, 1),
ncol = 5,
images = "esvq52_nluss5")
"{cd4}/{plt_dir}/magic_tfh_markers.pdf" %>%
glue::glue() %>%
here::here() %>%
cowplot::save_plot(
filename = .,
plot = gene_plt,
base_height = 35,
base_width = 25)
Tfh markers
Seurat::SpatialFeaturePlot(object = merged_se,
features = gene_dict[["CD4-Tfh"]],
alpha = c(0, 1),
ncol = 5,
image = "esvq52_nluss5")
Since we are working with sample esvq52_nluss5 in this example we will limit the correlation plot to this slide.
se_sub <- subset(merged_se, subset = gem_id == "esvq52_nluss5")
se_sub
## An object of class Seurat
## 26909 features across 3079 samples within 2 assays
## Active assay: MAGIC_Spatial (63 features, 0 variable features)
## 1 other assay present: Spatial
## 3 dimensional reductions calculated: pca, umap, harmony
se_sub@images <- se_sub@images[Seurat::Images(se_sub) == "esvq52_nluss5"]
(cor_mtrx <- SCrafty::correlation_heatmap(
se = se_sub,
genes = as.character(unique(unlist(gene_dict))),
assay = "MAGIC_Spatial",
slot = "data"))
"{cd4}/{plt_dir}/magic_cor-mtrx_markers.pdf" %>%
glue::glue() %>%
here::here() %>%
cowplot::save_plot(
filename = .,
plot = cor_mtrx,
base_height = 9,
base_width = 10)
# Correlation with lognorm expression
SCrafty::correlation_heatmap(
se = se_sub,
genes = as.character(unique(unlist(gene_dict))),
assay = "Spatial",
slot = "data")
Before we run the gene-correlation matrix on the integrated seurat object we want to make sure that the behavior across all slides is consistent.
lapply(id_sp_df$gem_id, function(id) {
tmp_sub <- subset(merged_se, subset = gem_id == id)
tmp_sub@images <- tmp_sub@images[Seurat::Images(tmp_sub) == id]
(cor_mtrx_genes <- SCrafty::correlation_heatmap(
se = tmp_sub,
genes = as.character(unique(unlist(gene_dict))),
assay = "MAGIC_Spatial",
slot = "data") +
ggplot2::labs(
title = glue::glue("{id} - gene correlation matrix")))
"{cd4}/{plt_dir}/magic_cor-mtrx_markers_{id}.pdf" %>%
glue::glue() %>%
here::here() %>%
cowplot::save_plot(
filename = .,
plot = cor_mtrx_genes,
base_height = 9,
base_width = 10)
})
## [[1]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/CD4-Analysis/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_tarwe1_xott6q.pdf"
##
## [[2]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/CD4-Analysis/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_c28w2r_7jne4i.pdf"
##
## [[3]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/CD4-Analysis/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_esvq52_nluss5.pdf"
##
## [[4]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/CD4-Analysis/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_p7hv1g_tjgmyj.pdf"
##
## [[5]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/CD4-Analysis/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_gcyl7c_cec61b.pdf"
##
## [[6]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/CD4-Analysis/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_zrt7gl_lhyyar.pdf"
##
## [[7]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/CD4-Analysis/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_qvwc8t_2vsr67.pdf"
##
## [[8]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/CD4-Analysis/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_exvyh1_66caqq.pdf"
After cheking all the slides seem to be consistent across the gene clusters observed:
(cor_mtrx_int <- SCrafty::correlation_heatmap(
se = merged_se,
genes = as.character(unique(unlist(gene_dict))),
assay = "MAGIC_Spatial",
slot = "data") +
ggplot2::labs(
title = "Integrated gene correlation matrix"))
"{cd4}/{plt_dir}/magic_cor-mtrx_markers_integrated.pdf" %>%
glue::glue() %>%
here::here() %>%
cowplot::save_plot(
filename = .,
plot = cor_mtrx_int,
base_height = 9,
base_width = 10)
We are going to look at how the genes change in a manually set path. To do this we use the SPATA2 package, vignette can be found here
We start by subsetting and converting to a SPATA object
# se_sub <- Seurat::RunTSNE(object = se_sub)
spata_sub <- SPATA2::transformSeuratToSpata(
seurat_object = se_sub,
sample_name = "esvq52_nluss5",
image_name = "esvq52_nluss5",
assay_name = "MAGIC_Spatial",
assay_slot = "data",
method = "spatial",
coords_from = "umap",
verbose = TRUE)
Spatial trajectories of a sample in a given spata-object can be drawn interactively using the function createTrajectories() as shown in the example below. createTrajectories() opens a mini-shiny application. This app allows one the one hand to investigate the sample with regards to spatial gene expression like plotSurfaceInteractive() does and on the other hand to draw trajectories through the areas of interest in four easy steps.
# open interactive application
spata_sub <- SPATA2::createTrajectories(
object = spata_sub)
# Check that the trajectory has been determined correctly
names(spata_sub@trajectories$esvq52_nluss5)
"{anot}/{robj_dir}/spata-esvq52_nluss5.rds" %>%
glue::glue() %>%
here::here() %>%
saveRDS(object = spata_sub, file = .)
Load drawn trajectories
spata_sub <- "{anot}/{robj_dir}/spata-esvq52_nluss5.rds" %>%
glue::glue() %>%
here::here() %>%
readRDS(file = .)
Look at the trajectory
plt1 <- SPATA2::plotTrajectory(
object = spata_sub,
trajectory_name = "Tfh-migration",
color_by = "annotation",
pt_clrp = "npg",
pt_size = 2,
pt_alpha = 0.75, # reduce alpha to highlight the trajectory's course
display_image = FALSE) +
SPATA2::legendTop() +
ggplot2::scale_y_reverse()
plt2 <- SPATA2::plotTrajectory(
object = spata_sub,
trajectory_name = "Tfh-migration-quiescent",
color_by = "annotation",
pt_clrp = "npg",
pt_size = 2,
pt_alpha = 0.75, # reduce alpha to highlight the trajectory's course
display_image = FALSE) +
SPATA2::legendTop() +
ggplot2::scale_y_reverse()
plt1 + plt2
"{cd4}/{plt_dir}/magic_trajectories_markers.pdf" %>%
glue::glue() %>%
here::here() %>%
cowplot::save_plot(
filename = .,
plot = plt1 + plt2,
base_height = 9,
base_width = 10)
Specify the genes or gene-sets of interest by using the respective functions and arguments.
# gene-set names
genes_of_interest <- c("CCR7", "CXCR5", "BCL6", "CD40", "MKI67", "PDCD1")
# plot lineplot
grad1 <- SPATA2::plotTrajectoryGenes(object = spata_sub,
trajectory_name = "Tfh-migration",
genes = genes_of_interest,
smooth_span = 0.2,
smooth_se = TRUE,
display_facets = TRUE, # use facet_wrap() to split the plot in four parts
nrow = 2 # align the sub plots in two rows
)
grad2 <- SPATA2::plotTrajectoryGenes(object = spata_sub,
trajectory_name = "Tfh-migration-quiescent",
genes = genes_of_interest,
smooth_span = 0.2,
smooth_se = TRUE,
display_facets = TRUE, # use facet_wrap() to split the plot in four parts
nrow = 2 # align the sub plots in two rows
)
grad1 / grad2
Look at all the genes in gene vec in the heat map
rm_genes <- c("IL6", "PROX1", "CD3E", "CD8A", "CD8B")
hm_colors <- viridis::inferno(n = 100)
SPATA2::plotTrajectoryHeatmap(
object = spata_sub,
trajectory_name = "Tfh-migration",
variables = gene_vec,
arrange_rows = "maxima",
colors = hm_colors,
show_rownames = TRUE,
split_columns = TRUE,
smooth_span = 0.5)
SPATA2::plotTrajectoryHeatmap(
object = spata_sub,
trajectory_name = "Tfh-migration-quiescent",
variables = gene_vec[!gene_vec %in% rm_genes],
arrange_rows = "maxima",
colors = hm_colors,
show_rownames = TRUE,
split_columns = TRUE,
smooth_span = 0.5)
Tfh differentiation usually starts with interaction of a naive CD4 + T cell with a myeloid professional antigen-presenting cell (APC) such as a dendritic cell (DC).
DCs predominantly localize to T cell zones and thus have the greatest opportunity to prime CD4 + T cells.
Upon priming by DCs, CD4 + T cells receiving Tfh cell-inductive signals upregulate Bcl6
step1 <- c(unlist(gene_dict[c("DC", "CD4-naive", "Lymph Endothelial", "T cells")]), "BCL6")
SPATA2::plotTrajectoryHeatmap(
object = spata_sub,
trajectory_name = "Tfh-migration-quiescent",
variables = step1[!step1 %in% rm_genes],
arrange_rows = "maxima",
colors = hm_colors,
show_rownames = TRUE,
split_columns = TRUE,
smooth_span = 0.5)
The migration of Tfh cell into GCs is facilitated by repression of the migration-associated receptor PSGL1 and the chemoattractant receptor Ebi2, and changes in the expression of S1P receptors, SLAM family receptors, and integrins. ICOS is particularly fascinating, as it functions as both a costimulatory molecule and a migration receptor for Tfh cells
step2 <- c(unlist(gene_dict[c("CD4-Tfh", "T cells")]), "BCL6", "CCR7", "CD4")
SPATA2::plotTrajectoryHeatmap(
object = spata_sub,
trajectory_name = "Tfh-migration-quiescent",
variables = step2[!step2 %in% c(rm_genes, "IL6R")],
arrange_rows = "maxima",
colors = hm_colors,
show_rownames = TRUE,
split_columns = TRUE,
smooth_span = 0.5)
Tfh cells provide IL-21 and CD40L signals required for B cell proliferation and differentiation toward both GC and extrafollicular fates (Lee et al., 2011) (Figure 3A). IL-4 expression by Tfh cells is only acquired later, upon full differentiation to GC-Tfh cells (Weinstein et al., 2016; Yusuf et al., 2010). B cells compete for Tfh help at the T-B border based on the amount of p:MHCII presented by the B cell to the Tfh cell (Schwickert et al., 2011; Yeh et al., 2018). The success of B cells competing for early Tfh help depends on the frequency of the B cells and their antigen affinity (Abbott et al., 2018; Schwickert et al., 2011). Rare B cells with low affinity may be excluded from immune responses at this early Tfh cell checkpoint, which has implications for vaccines because neutralizing epitope-specific B cells against some pathogens may be quite rare and low affinity (Havenar-Daughton et al., 2017).
step3 <- c(unlist(gene_dict[c("CD4-Tfh", "B cells", "Proliferation")]),
"BCL6", "CCR7", "IL12", "HLA-DRA")
SPATA2::plotTrajectoryHeatmap(
object = spata_sub,
trajectory_name = "Tfh-migration-quiescent",
variables = step3[!step3 %in% c(rm_genes, "IL6R")],
arrange_rows = "maxima",
colors = hm_colors,
show_rownames = TRUE,
split_columns = TRUE,
smooth_span = 0.5)
The help provided by GC-Tfh cells to B GC cells classically consists of IL-21, IL-4, CD40L, and CXCL13, in addition to production of more widely expressed cytokines such as IL-2 and TNF. The combination of IL-21 and IL-4 expression by GC-Tfh cells maximally supports B GC cells (Weinstein et al. 2016), in addition to CD40L. While GC-Tfh cells express substantial amounts of IL-21 and IL-4 RNA, GC-Tfh cells secrete infinitesimal quanta of IL-21 and IL-4 protein, consistent with GC-Tfh cells constraining GCs as a resource limited environment
Dopamine secretion by human GC-Tfh cells enhances rapid ICOSL surface expression by human B GC cells, resulting in a feedforward help loop between the interacting GC-Tfh and B GC cells
L-10 also appears to have species-specific functions. IL-10 is made by some human GC-Tfh cells, and IL-10 has long been known as a PC differentiation factor for human B cells
step4 <- c(unlist(gene_dict[c("CD4-GC-Tfh", "B cells", "Proliferation", "Chemokines")]),
"BCL6", "CCR7", "HLA-DRA", "IL4", "ICOS", "CD40LG", "CXCL13", "IL10")
SPATA2::plotTrajectoryHeatmap(
object = spata_sub,
trajectory_name = "Tfh-migration-quiescent",
variables = step4[!step4 %in% c(rm_genes, "IL6R")],
arrange_rows = "maxima",
colors = hm_colors,
show_rownames = TRUE,
split_columns = TRUE,
smooth_span = 0.5)
step2 <- c(unlist(gene_dict[c("CD4-non-Tfh", "Chemokines")]), "BCL6", "CCR7")
SPATA2::plotTrajectoryHeatmap(
object = spata_sub,
trajectory_name = "Tfh-migration-quiescent",
variables = step2[!step2 %in% c(rm_genes, "IL6R")],
arrange_rows = "maxima",
colors = hm_colors,
show_rownames = TRUE,
split_columns = TRUE,
smooth_span = 0.5)
Plot comparing expression of TCF7 & BCL6
feat_plt <- Seurat::SpatialFeaturePlot(
object = se_sub,
features = c("BCL6", "TCF7"),
alpha = c(0, 1))
se_sub[["Spatial_snn_res.0.3"]] <- as.character(se_sub@meta.data[, "Spatial_snn_res.0.3"])
sctr_plt <- scatterplot(x = "BCL6", y = "TCF7", color = "annotation")
dim_plt <- Seurat::SpatialPlot(
object = se_sub,
group.by = "annotation") +
Seurat::NoLegend()
bot <- (sctr_plt + dim_plt) +
patchwork::plot_layout(guides = "collect")
(fig_arr <- feat_plt / bot)
"{cd4}/{plt_dir}/arr_bcl6_tcf7.pdf" %>%
glue::glue() %>%
here::here() %>%
cowplot::save_plot(
filename = .,
plot = fig_arr,
base_height = 10,
base_width = 10)
Plot comparing expression of PRDM1 & BCL6
feat_plt <- Seurat::SpatialFeaturePlot(
object = se_sub,
features = c("BCL6", "PRDM1"),
alpha = c(0, 1))
sctr_plt <- scatterplot(x = "BCL6", y = "PRDM1", color = "annotation")
dim_plt <- Seurat::SpatialPlot(
object = se_sub,
group.by = "annotation") +
Seurat::NoLegend()
bot <- (sctr_plt + dim_plt) +
patchwork::plot_layout(guides = "collect")
(fig_arr <- feat_plt / bot)
"{cd4}/{plt_dir}/arr_bcl6_prdm1.pdf" %>%
glue::glue() %>%
here::here() %>%
cowplot::save_plot(
filename = .,
plot = fig_arr,
base_height = 10,
base_width = 10)
sessionInfo()
## R version 4.0.1 (2020-06-06)
## Platform: x86_64-conda_cos6-linux-gnu (64-bit)
## Running under: Red Hat Enterprise Linux Server release 6.7 (Santiago)
##
## Matrix products: default
## BLAS/LAPACK: /scratch/groups/hheyn/software/anaconda3/envs/spatial_r/lib/libopenblasp-r0.3.12.so
##
## locale:
## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=es_ES.UTF-8 LC_COLLATE=en_US.UTF-8 LC_MONETARY=es_ES.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=es_ES.UTF-8 LC_NAME=C LC_ADDRESS=C LC_TELEPHONE=C LC_MEASUREMENT=es_ES.UTF-8 LC_IDENTIFICATION=C
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] SPATA2_0.1.0 ggplot2_3.3.5 dplyr_1.0.7 SeuratObject_4.0.2 Seurat_4.0.3
##
## loaded via a namespace (and not attached):
## [1] corrplot_0.89 plyr_1.8.6 igraph_1.2.6 lazyeval_0.2.2 splines_4.0.1 listenv_0.8.0 scattermore_0.7 GenomeInfoDb_1.26.4 digest_0.6.27 htmltools_0.5.1.1 viridis_0.6.1 tiff_0.1-8 fansi_0.5.0 magrittr_2.0.1 tensor_1.5 cluster_2.1.0 ROCR_1.0-11 globals_0.14.0 readr_1.4.0 matrixStats_0.59.0 spatstat.sparse_2.0-0 prettyunits_1.1.1 jpeg_0.1-8.1 colorspace_2.0-2 ggrepel_0.9.1 xfun_0.23 crayon_1.4.1 RCurl_1.98-1.3 jsonlite_1.7.2 spatstat.data_2.1-0 survival_3.2-11 zoo_1.8-9 glue_1.4.2 polyclip_1.10-0 gtable_0.3.0 zlibbioc_1.36.0 XVector_0.30.0 leiden_0.3.8 DelayedArray_0.16.3 future.apply_1.7.0 SingleCellExperiment_1.12.0 BiocGenerics_0.36.0
## [43] abind_1.4-5 scales_1.1.1 pheatmap_1.0.12 DBI_1.1.1 miniUI_0.1.1.1 Rcpp_1.0.6 progress_1.2.2 viridisLite_0.4.0 xtable_1.8-4 tmvnsim_1.0-2 reticulate_1.20 spatstat.core_2.2-0 stats4_4.0.1 htmlwidgets_1.5.3 httr_1.4.2 RColorBrewer_1.1-2 ellipsis_0.3.2 ica_1.0-2 pkgconfig_2.0.3 farver_2.1.0 sass_0.4.0 uwot_0.1.10 deldir_0.2-3 locfit_1.5-9.4 utf8_1.2.1 here_1.0.1 ggcorrplot_0.1.3 labeling_0.4.2 tidyselect_1.1.1 rlang_0.4.11 reshape2_1.4.4 later_1.2.0 munsell_0.5.0 tools_4.0.1 cli_2.5.0 generics_0.1.0 ggridges_0.5.3 fftwtools_0.9-11 evaluate_0.14 stringr_1.4.0 fastmap_1.1.0 yaml_2.2.1
## [85] goftest_1.2-2 knitr_1.33 fitdistrplus_1.1-3 purrr_0.3.4 RANN_2.6.1 pbapply_1.4-3 future_1.21.0 nlme_3.1-150 mime_0.11 SCrafty_0.1.0 compiler_4.0.1 rstudioapi_0.13 plotly_4.9.4.1 png_0.1-7 spatstat.utils_2.2-0 confuns_0.1.0 tibble_3.1.2 bslib_0.2.5.1 stringi_1.6.2 highr_0.9 ps_1.6.0 lattice_0.20-44 Matrix_1.3-4 psych_2.1.3 vctrs_0.3.8 pillar_1.6.1 lifecycle_1.0.0 spatstat.geom_2.2-0 lmtest_0.9-38 jquerylib_0.1.4 RcppAnnoy_0.0.18 data.table_1.14.0 cowplot_1.1.1 bitops_1.0-7 irlba_2.3.3 httpuv_1.6.1 patchwork_1.1.1 GenomicRanges_1.42.0 R6_2.5.0 promises_1.2.0.1 KernSmooth_2.23-18 gridExtra_2.3
## [127] IRanges_2.24.1 parallelly_1.26.0 codetools_0.2-18 MASS_7.3-54 assertthat_0.2.1 SummarizedExperiment_1.20.0 rprojroot_2.0.2 withr_2.4.2 mnormt_2.0.2 sctransform_0.3.2 S4Vectors_0.28.1 GenomeInfoDbData_1.2.4 EBImage_4.32.0 mgcv_1.8-36 parallel_4.0.1 hms_1.1.0 grid_4.0.1 rpart_4.1-15 tidyr_1.1.3 rmarkdown_2.8 MatrixGenerics_1.2.1 Rtsne_0.15 lubridate_1.7.10 Biobase_2.50.0 shiny_1.6.0